package com.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.FixedValue;
import net.sf.cglib.proxy.InvocationHandler;

//https://github.com/cglib/cglib
public class SampleClass4 {

	public String test(String input){
        return "hello world";
    }

    public static void main(String[] args) {
    	Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(SampleClass4.class);
        //可以使用一个InvocationHandler作为回调，使用invoke方法来替换直接访问类的方法，但是你必须注意死循环。因为invoke中调用的任何原代理类方法，均会重新代理到invoke方法中。
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if(method.getDeclaringClass() != Object.class && method.getReturnType() == String.class){
                    return "hello cglib";
                }else{
                    throw new RuntimeException("Do not know what to do");
                }
            }
        });
        SampleClass4 proxy = (SampleClass4) enhancer.create();
        System.out.println(proxy.test(null));
        System.out.println(proxy.toString());
    }

}
